package cn.edu.ctgu.geo.wei.test;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.math.BigDecimal;
import java.math.MathContext;

/**
 * 北斗网格信息实体类（存储网格基准坐标、步长、编码等）
 */
@Data
@Builder
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class GridInfo {
    // 常量：1度=3600秒，1分=60秒（统一单位为秒，避免精度丢失）
    public static final BigDecimal SECONDS_PER_DEGREE = new BigDecimal("3600");
    public static final BigDecimal SECONDS_PER_MINUTE = new BigDecimal("60");

    // 各层级经度步长（单位：秒）：1级=6°=21600秒，2级=30'=1800秒...10级=1/2048秒
    public static final BigDecimal[] LON_STEPS = {
            new BigDecimal("6").multiply(SECONDS_PER_DEGREE),    // 1级：6°
            new BigDecimal("30").multiply(SECONDS_PER_MINUTE),   // 2级：30'
            new BigDecimal("15").multiply(SECONDS_PER_MINUTE),   // 3级：15'
            SECONDS_PER_MINUTE,                                  // 4级：1'
            new BigDecimal("4"),                                 // 5级：4秒
            new BigDecimal("2"),                                 // 6级：2秒
            new BigDecimal("0.25"),                              // 7级：0.25秒
            new BigDecimal("1").divide(new BigDecimal("32"), MathContext.DECIMAL128),  // 8级：1/32秒
            new BigDecimal("1").divide(new BigDecimal("256"), MathContext.DECIMAL128), // 9级：1/256秒
            new BigDecimal("1").divide(new BigDecimal("2048"), MathContext.DECIMAL128) // 10级：1/2048秒
    };

    // 各层级纬度步长（单位：秒）：1级=4°=14400秒，2级=30'=1800秒...10级=1/2048秒
    public static final BigDecimal[] LAT_STEPS = {
            new BigDecimal("4").multiply(SECONDS_PER_DEGREE),    // 1级：4°
            new BigDecimal("30").multiply(SECONDS_PER_MINUTE),   // 2级：30'
            new BigDecimal("10").multiply(SECONDS_PER_MINUTE),   // 3级：10'
            SECONDS_PER_MINUTE,                                  // 4级：1'
            new BigDecimal("4"),                                 // 5级：4秒
            new BigDecimal("2"),                                 // 6级：2秒
            new BigDecimal("0.25"),                              // 7级：0.25秒
            new BigDecimal("1").divide(new BigDecimal("32"), MathContext.DECIMAL128),  // 8级：1/32秒
            new BigDecimal("1").divide(new BigDecimal("256"), MathContext.DECIMAL128), // 9级：1/256秒
            new BigDecimal("1").divide(new BigDecimal("2048"), MathContext.DECIMAL128) // 10级：1/2048秒
    };

    // 核心字段
    private BigDecimal baseLon;       // 原始经度（秒）
    private BigDecimal baseLat;       // 原始纬度（秒）
    private BigDecimal currentLon;    // 当前层级网格左下角经度（秒）
    private BigDecimal currentLat;    // 当前层级网格左下角纬度（秒）
    private int column;               // 当前层级网格列号（经度方向）
    private int row;                  // 当前层级网格行号（纬度方向）
    private int gridStepLevel;        // 当前网格层级（1-10）
    private String gridCode;          // 完整网格码
    private double centerLng;          // 中心点经度
    private double centerLat;         // 中心点纬度  中心点的经纬度计算方式就是 “最小 + 最大后除以 2”


    /**
     * 获取当前层级的经度步长（秒）
     */
    public BigDecimal getCurrentLonStep() {
        if (gridStepLevel < 1 || gridStepLevel > LON_STEPS.length) {
            throw new BeidouGridException("层级超出范围（1-10）：" + gridStepLevel);
        }
        return LON_STEPS[gridStepLevel - 1];
    }

    /**
     * 获取当前层级的纬度步长（秒）
     */
    public BigDecimal getCurrentLatStep() {
        if (gridStepLevel < 1 || gridStepLevel > LAT_STEPS.length) {
            throw new BeidouGridException("层级超出范围（1-10）：" + gridStepLevel);
        }
        return LAT_STEPS[gridStepLevel - 1];
    }

    /**
     * 转换秒为十进制度（用于最终范围输出）
     */
    public static BigDecimal secondsToDegree(BigDecimal seconds) {
        return seconds.divide(SECONDS_PER_DEGREE, new MathContext(8, java.math.RoundingMode.HALF_UP));

    }
}